/*!
 * \file IExecCommand.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 执行命令接口头文件
 * 
 * 定义了WonderTrader系统中执行器相关的核心接口：
 * 1. IExecuterStub - 执行器存根接口，提供执行器所需的基础服务
 * 2. IExecCommand - 执行命令接口，定义执行器的核心操作
 * 
 * 这些接口为交易执行模块提供了标准化的抽象层，
 * 支持不同类型的执行器实现和扩展。
 */
#pragma once
#include "../Includes/FasterDefs.h"
#include <stdint.h>

NS_WTP_BEGIN
class WTSCommodityInfo;
class WTSSessionInfo;
class IHotMgr;
class WTSTickData;

/**
 * @class IExecuterStub
 * @brief 执行器存根接口
 * 
 * 执行器存根接口为执行器提供必要的基础服务和数据访问能力：
 * 1. 获取实时时间信息
 * 2. 获取品种和交易时段信息
 * 3. 获取热点管理器和交易日信息
 * 
 * 该接口作为执行器与系统其他模块之间的桥梁，
 * 提供执行器运行所需的基础数据和服务。
 */
class IExecuterStub
{
public:
	/**
	 * @brief 获取实时时间
	 * @return 实时时间戳（微秒级）
	 * 
	 * 获取系统当前的实时时间，用于时间相关的计算和判断
	 */
	virtual uint64_t get_real_time() = 0;
	
	/**
	 * @brief 获取品种信息
	 * @param stdCode 标准合约代码
	 * @return 品种信息对象指针
	 * 
	 * 根据标准合约代码获取对应的品种信息，
	 * 包含品种的基本属性、交易规则等
	 */
	virtual WTSCommodityInfo* get_comm_info(const char* stdCode) = 0;
	
	/**
	 * @brief 获取交易时段信息
	 * @param stdCode 标准合约代码
	 * @return 交易时段信息对象指针
	 * 
	 * 根据标准合约代码获取对应的交易时段信息，
	 * 包含开盘时间、收盘时间、休市时间等
	 */
	virtual WTSSessionInfo* get_sess_info(const char* stdCode) = 0;
	
	/**
	 * @brief 获取热点管理器
	 * @return 热点管理器接口指针
	 * 
	 * 获取热点管理器，用于主力合约切换等功能
	 */
	virtual IHotMgr* get_hot_mon() = 0;
	
	/**
	 * @brief 获取当前交易日
	 * @return 交易日（格式：YYYYMMDD）
	 * 
	 * 获取系统当前的交易日期
	 */
	virtual uint32_t get_trading_day() = 0;
};

/**
 * @class IExecCommand
 * @brief 执行命令接口
 * 
 * 执行命令接口定义了执行器的核心操作和回调方法：
 * 1. 设置目标持仓
 * 2. 处理持仓变动事件
 * 3. 处理实时行情数据
 * 
 * 该接口为不同类型的执行器提供统一的操作规范，
 * 支持策略引擎与执行器之间的标准化交互。
 */
class IExecCommand
{
public:
	/**
	 * @brief 构造函数
	 * @param name 执行器名称
	 * 
	 * 初始化执行命令对象，设置执行器名称
	 */
	IExecCommand(const char* name) :_stub(NULL), _name(name){}
	
	/**
	 * @brief 设置目标持仓
	 * @param targets 目标持仓映射表，键为合约代码，值为目标持仓量
	 * 
	 * 设置执行器的目标持仓，执行器将根据目标持仓
	 * 与当前持仓的差异进行相应的交易操作
	 */
	virtual void set_position(const faster_hashmap<LongKey, double>& targets) {}

	/**
	 * @brief 合约持仓变动回调
	 * @param stdCode 标准合约代码
	 * @param targetPos 目标持仓量
	 * 
	 * 当某个合约的目标持仓发生变化时触发此回调，
	 * 执行器可以根据新的目标持仓进行相应处理
	 */
	virtual void on_position_changed(const char* stdCode, double targetPos) {}

	/**
	 * @brief 实时行情回调
	 * @param stdCode 标准合约代码
	 * @param newTick 最新的Tick数据
	 * 
	 * 当收到新的实时行情数据时触发此回调，
	 * 执行器可以根据最新行情进行交易决策
	 */
	virtual void on_tick(const char* stdCode, WTSTickData* newTick) {}

	/**
	 * @brief 设置执行器存根
	 * @param stub 执行器存根接口指针
	 * 
	 * 设置执行器存根，建立与系统基础服务的连接
	 */
	inline void setStub(IExecuterStub* stub) { _stub = stub; }

	/**
	 * @brief 获取执行器名称
	 * @return 执行器名称字符串
	 * 
	 * 获取当前执行器的名称
	 */
	inline const char* name() const { return _name.c_str(); }

	/**
	 * @brief 设置执行器名称
	 * @param name 新的执行器名称
	 * 
	 * 更新执行器的名称
	 */
	inline void setName(const char* name) { _name = name; }

protected:
	IExecuterStub*	_stub;		///< 执行器存根接口指针
	std::string		_name;		///< 执行器名称
};
NS_WTP_END